home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr49 / pgp23src.zip / PLATFORM.H < prev    next >
C/C++ Source or Header  |  1993-05-12  |  7KB  |  219 lines

  1. /*    platform.h - computer platform customization for PGP
  2.     multiprecision math package.  #Included in mpilib.h.
  3. */
  4. #ifndef PLATFORM_H
  5. #define PLATFORM_H
  6.  
  7. /* Platform customization:
  8.  * A version which runs on almost any computer can be implemented by
  9.  * defining PORTABLE and MPORTABLE, preferably as a command line
  10.  * parameter.  Faster versions can be generated by specifying specific
  11.  * parameters, such as size of unit and MULTUNIT, and by supplying some
  12.  * of the critical in assembly.  
  13.  *
  14.  * This file holds customizations for different environments.
  15.  * This is done in one of two ways:
  16.  *    1. A symbol is defined on the command line which designates a 
  17.  *    particular environment, such as MSDOS.  This file detects the 
  18.  *    environment symbol and sets the appropriate low-level defines.
  19.  *
  20.  *    2. If no environment is named, the low-level defines are set in
  21.  *    the same manner as for PGP 2.0, thereby providing an easy upgrade.
  22.  *
  23.  * Following are a description of the low-level definition symbols:
  24.  *
  25.  * The following preprocessor symbols should be conditionally set to 
  26.  * optimize for a particular environment.
  27.  *
  28.  * Define one of the following:
  29.  *    UNIT8, UNIT16, or UNIT32    - specifies size of operands for
  30.  *    multiprecision add, subtract, shift, and initialization operations.
  31.  * Define one of the following:
  32.  *    MUNIT8, MUNIT16, MUNIT32    - specified size of operands for 
  33.  *    multiprecision multiply and mod_mult.  This must be less than or
  34.  *    equal to unit size.  It should be the word size for the native
  35.  *    atomic multiply instruction.  For a 16x16 bit multiply yielding a
  36.  *    32-bit product, MUNIT16 should be set.
  37.  * Define one (or more) of the following:
  38.  *    PEASANT, MERRITT, UPTON, SMITH    -algorithm used for modmult.  All defined
  39.  *    algorithms are compiled, but the first defined name listed will be 
  40.  *    assigned to the generic entry point symbols.  Multiple algorithms are
  41.  *    used primarily for testing.
  42.  * HIGHFIRST - specified if longs are stored with the most significant
  43.  *    bit at the lowest address (Motorola), undefined otherwise.  This should
  44.  *    be defined on the command line, normally in the makefile.
  45.  *
  46.  * The following symbol, if initialized, is set to specific values:
  47.  * ALIGN - variable declaration attribute which forces optimum alignment
  48.  *    of words, e.g. for VAX C: ALIGN=_align(quadword)
  49.  *
  50.  * The following symbols correspond to individual multiprecision routines
  51.  * that may be implemented with assembly language.  If they are implemented
  52.  * in assembly, the symbols should be defined with the name of the
  53.  * corresponding external entry points, e.g., mp_addc=P_ADDC
  54.  *    mp_setp        - set precision for external routines
  55.  *    mp_addc        - add with carry
  56.  *    mp_subb        - subtract with borrow
  57.  *    mp_rotate_left - rotate left
  58.  *    mp_compare     - compare
  59.  *    mp_move        - move
  60.  *    unitfill0      - zero fill
  61.  *    mp_smul        - multiply vector by single word *
  62.  *    mp_smula       - multiply vector by single word and accumulate *
  63.  *    mp_dmul        - full multiply 
  64.  *    mp_set_recip   - setup for mp_quo_digit
  65.  *    mp_quo_digit   - quotient digit for modulus reduction
  66.  *
  67.  * Either mp_smul or mp_smula should be defined.  mp_smula provides
  68.  * for accumulation to an existing value, while mp_smul is for use of the
  69.  * older definition of mp_smul, used in PGP 2.0, which assumed that the high 
  70.  * order accumulator word is zero.   Use of mp_smula causes one less word of 
  71.  * precision to be used, thereby slightly increasing speed.
  72.  */
  73.  
  74. /********************************************************************
  75.  * Environment customization.  Please send any additions or corrections
  76.  * to Philip Zimmermann.
  77.  */
  78. #ifndef PORTABLE
  79.  
  80. #ifdef MSDOS
  81. #ifndef i386 /* gcc */
  82. #define UNIT16
  83. #define MUNIT16
  84. #define mp_setp        P_SETP
  85. #define mp_addc        P_ADDC
  86. #define mp_subb        P_SUBB
  87. #define mp_rotate_left    P_ROTL
  88. #define mp_smula    P_SMULA
  89. #define mp_quo_digit    P_QUO_DIGIT
  90. #define mp_set_recip    P_SETRECIP
  91. #define SMITH
  92. #define PLATFORM_SPECIFIED
  93. #endif /* i386 */
  94. #endif /* MSDOS */
  95.  
  96. #ifdef VMS
  97. #define UNIT32         /* use 32-bit units */
  98. #define MUNIT32        /* not used in C code, only in assembler */
  99. #define UPTON
  100. #define mp_setp        p_setp
  101. #define mp_addc        p_addc
  102. #define mp_subb        p_subb
  103. #define mp_rotate_left    p_rotl
  104. #define mp_smul    p_smul
  105. #define mp_dmul    p_dmul
  106. #define mp_compare    p_cmp
  107. #define ALIGN _align(quadword)
  108.  
  109. #ifdef VAXC
  110. /*
  111.  * A VAX is a CISC machine. Unfortunately C is at to low a level to use
  112.  * many of the instruction set enhancements so we define some macros
  113.  * here that implement fast moves and fast zero fills with single
  114.  * instructions.
  115.  */
  116. #pragma builtins
  117. #define mp_move( dst, src)      _MOVC3( global_precision*4, (char *) src, (char *) dst)
  118. #define unitfill0( r, unitcount) _MOVC5( 0, (char *) 0, 0, unitcount*4, (char *) r)
  119. #define mp_burn(r) _MOVC5(0, (char *) 0, 0, global_precision*4, (char *) r)
  120. #define mp_init0(r) mp_burn(r)    /* Just for documentation purposes */
  121. #endif    /* VAXC */
  122.  
  123. #define PLATFORM_SPECIFIED
  124. #endif /* VMS */
  125.  
  126. #ifdef mips
  127. /*
  128.  * Needs r3kd.s and r3000.s (or r3000.c)
  129.  */
  130. #define UNIT32
  131. #define MUNIT32
  132. #define SMITH
  133. #define mp_dmul        p_dmul
  134. #define mp_setp        p_setp
  135. #define mp_addc        p_addc
  136. #define mp_subb        p_subb
  137. #define mp_rotate_left    p_rotl
  138. #define mp_smula    p_smula
  139. #define mp_quo_digit    p_quo_digit
  140. #define mp_set_recip    p_setrecip
  141. #define PLATFORM_SPECIFIED
  142. #endif /* mips */
  143.  
  144. #ifdef i386
  145. /*
  146.  * Needs 80386.S
  147.  */
  148. #define UNIT32
  149. #define MUNIT32
  150. #define SMITH
  151. #define mp_setp        P_SETP
  152. #define mp_addc        P_ADDC
  153. #define mp_subb        P_SUBB
  154. #define mp_rotate_left    P_ROTL
  155. #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
  156. #define mp_smula    P_SMULA
  157. #define mp_quo_digit    p_quo_digit
  158. #define mp_set_recip    p_setrecip
  159. #define PLATFORM_SPECIFIED
  160. #endif /* i386 */
  161.  
  162. #ifdef sparc
  163. /*
  164.  * Needs sparc.s
  165.  */
  166. #define UNIT32
  167. #define MERRITT
  168. #define mp_setp        P_SETP
  169. #define mp_addc        P_ADDC
  170. #define mp_subb        P_SUBB
  171. #define mp_rotate_left    P_ROTL
  172. #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
  173. #define PLATFORM_SPECIFIED
  174. #endif /* sparc */
  175.  
  176. #if defined(mc68000) || defined(mc68020)
  177. /*
  178.  * Needs mc68020.S
  179.  */
  180. #define UNIT32
  181. #define mp_setp        P_SETP
  182. #define mp_addc        P_ADDC
  183. #define mp_subb        P_SUBB
  184. #define mp_rotate_left    P_ROTL
  185. #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
  186. #if defined(sun3) || defined(mc68020)
  187. # define UPTON
  188. # define MUNIT32
  189. # define mp_smul    P_SMUL
  190. /* # define mp_dmul    P_DMUL */ /* mc68020.s has a bug in P_DMUL */
  191. #else
  192. # define SMITH
  193. # define MUNIT16
  194. #endif
  195. #define PLATFORM_SPECIFIED
  196. #endif /* mc68000 */
  197.  
  198. /* Add additional platforms here ... */
  199.  
  200. /**************** End of system specification ************************/
  201.  
  202. #ifndef PLATFORM_SPECIFIED
  203. /* No platform explicitly selected.  Customization is controlled by
  204.  * PORTABLE and MPORTABLE.
  205.  */
  206. #define mp_setp        P_SETP
  207. #define mp_addc        P_ADDC
  208. #define mp_subb        P_SUBB
  209. #define mp_rotate_left    P_ROTL
  210. #define UPTON
  211. #define unitfill0(r,ct) memset((void*)r, 0, (ct)*sizeof(unit))
  212. #ifndef MPORTABLE
  213. #define mp_smul    P_SMUL
  214. #endif    /* MPORTABLE */
  215. #endif    /* PLATFORM_SPECIFIED */
  216. #endif    /* PORTABLE */
  217. #endif    /* PLATFORM_H */
  218.  
  219.